package pool_ip

import (
	"sync/atomic"
)

// PopularIter 迭代器结构体，使用原子操作保证并发安全
type PopularIter struct {
	list []string
	idx  uint64
}

var CountryMapArr = map[string][]string{
	"pop":    {"US", "KR", "HK", "JP", "PH"},
	"eu_pop": {"CH", "ES", "SE", "IT", "GB", "FR", "DE", "NL"},
}

// NewPopularIter 创建一个新的迭代器
func NewPopularIter(typeStr string) *PopularIter {
	var CountryArr = CountryMapArr[typeStr]
	if CountryArr == nil {
		CountryArr = CountryMapArr["pop"]
	}
	return &PopularIter{
		list: CountryArr,
	}
}

// Next 返回当前元素并将内部索引向前移动；达到末尾则自动环绕。
// 并发安全，性能优于互斥锁版本。
func (p *PopularIter) Next() string {
	// 先读取一次长度，避免多次 len 调用
	n := uint64(len(p.list))
	if n == 0 {
		// 防护空列表，只有当你手动清空了 list 才会返回 ""
		return ""
	}
	// 原子地将 idx 加 1，返回的是加完之后的值，减 1 得到当前使用的序号
	seq := atomic.AddUint64(&p.idx, 1) - 1
	// 取模环绕
	return p.list[seq%n]
}
